home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 0.9.1.3 stable / flock-0.9.1.3.en-US.win32.exe / flock / components / flockWordpressService.js < prev    next >
Text File  |  2007-10-12  |  22KB  |  633 lines

  1. // BEGIN FLOCK GPL
  2. // 
  3. // Copyright Flock Inc. 2005-2007
  4. // http://flock.com
  5. // 
  6. // This file may be used under the terms of of the
  7. // GNU General Public License Version 2 or later (the "GPL"),
  8. // http://www.gnu.org/licenses/gpl.html
  9. // 
  10. // Software distributed under the License is distributed on an "AS IS" basis,
  11. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12. // for the specific language governing rights and limitations under the
  13. // License.
  14. // 
  15. // END FLOCK GPL
  16. //
  17.  
  18. const ENABLE_DEBUG = true; // switch to turn off slow debug code for production
  19. function DEBUG(x) { if (ENABLE_DEBUG) debug("flockWordpressService: "+x+"\n"); }
  20.  
  21. const Cc = Components.classes;
  22. const Ci = Components.interfaces;
  23. const Cr = Components.results;
  24.  
  25. const WORDPRESS_CID = Components.ID('{458ca863-38fd-4c9b-b76b-44f0453a62cd}');
  26. const WORDPRESS_CONTRACTID = '@flock.com/people/wordpress;1';
  27. const SERVICE_ENABLED_PREF          = "flock.service.wordpress.enabled";
  28. const CATEGORY_COMPONENT_NAME       = "Wordpress JS Component"
  29. const CATEGORY_ENTRY_NAME           = "wordpress"
  30.  
  31. const WORDPRESS_FAVICON = 'http://www.wordpress.com/favicon.ico';
  32.  
  33. const RDFS = Cc['@mozilla.org/rdf/rdf-service;1'].getService (Ci.nsIRDFService);
  34.  
  35. var gCompTK;
  36. function getCompTK() {
  37.   if (!gCompTK) {
  38.     gCompTK = Components.classes["@flock.com/singleton;1"]
  39.                         .getService(Components.interfaces.flockISingleton)
  40.                         .getSingleton("chrome://browser/content/flock/services/common/load-compTK.js")
  41.                         .wrappedJSObject;
  42.   }
  43.   return gCompTK;
  44. }
  45.  
  46. function loadSubScript(spec) {
  47.   var loader = Cc['@mozilla.org/moz/jssubscript-loader;1'].getService(Ci.mozIJSSubScriptLoader);
  48.   var context = {};
  49.   loader.loadSubScript(spec, context);
  50.   return context;
  51. }
  52.  
  53. var loader = Cc['@mozilla.org/moz/jssubscript-loader;1'].getService(Ci.mozIJSSubScriptLoader);
  54.  
  55. loader.loadSubScript('chrome://browser/content/utilityOverlay.js');
  56. loader.loadSubScript("chrome://browser/content/flock/xmlrpc/xmlrpchelper.js");
  57. loader.loadSubScript("chrome://browser/content/flock/blog/blogBackendLib.js");
  58.  
  59.  
  60. function userBlogsListener(aListener){
  61.   this.listener = aListener;
  62. }
  63.  
  64. userBlogsListener.prototype =
  65. {
  66.   // aResult is an Array (simpleEnumerator) of struct objects
  67.   onResult: function(aResult) {
  68.     var result = new Array();
  69.     for (i=0; i<aResult.length; i++){
  70.       var entry = aResult[i];
  71.       var newAccount = new BlogAccount(entry.blogName);
  72.       newAccount.blogid = entry.blogid;
  73.       newAccount.apiLink = "";
  74.       newAccount.URL = entry.url;
  75.       result.push(newAccount);
  76.     }
  77.     this.listener.onResult(new simpleEnumerator(result));
  78.   },
  79.   onError: function(errorcode, errormsg) {
  80.     var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  81.     error.serviceErrorCode = errorcode;
  82.     error.serviceErrorString = errormsg;
  83.     this.listener.onError(error);
  84.   },
  85.   onFault: function(errorcode, errormsg) {
  86.     var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  87.     error.serviceErrorCode = errorcode;
  88.     error.serviceErrorString = errormsg;
  89.     switch (errorcode) {
  90.       case 0: // Invalid login/pass
  91.         error.errorCode = Ci.flockIError.BLOG_INVALID_AUTH;
  92.         error.errorString = "Bad authentication";
  93.         break;
  94.       default: // Unknown error code
  95.         error.errorCode = Ci.flockIError.BLOG_UNKNOWN;
  96.         error.errorString = "Unknown Error";
  97.     }
  98.     this.listener.onFault(error);
  99.   }
  100. }
  101.  
  102.  
  103. function flockWPService () {
  104.   var obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  105.   obs.addObserver(this, 'xpcom-shutdown', false);
  106.   this.status = Ci.flockIWebService.STATUS_UNKNOWN;
  107.   this.initialized = false;
  108.  
  109.   this._ctk = {
  110.     interfaces: [
  111.       "nsISupports",
  112.       "nsIClassInfo",
  113.       "nsIObserver",
  114.       "nsISupportsCString",
  115.       "flockIWebService",
  116.       "flockIAuthenticateNewAccount",
  117.       "flockIManageableWebService",
  118.       "flockIBlogWebService"
  119.     ],
  120.     shortName: "wordpress",
  121.     fullName: "WordPress.com",
  122.     description: "WordPress.com Web Service",
  123.     favicon: WORDPRESS_FAVICON,
  124.     CID: WORDPRESS_CID,
  125.     contractID: WORDPRESS_CONTRACTID,
  126.     accountClass: flockWPAccount
  127.   };
  128.   this._profiler = Cc["@flock.com/profiler;1"].getService(Ci.flockIProfiler);
  129.  
  130.   this.init();
  131. }
  132.  
  133. // nsIObserver
  134. flockWPService.prototype.observe = function flockWPService_observe(subject, topic, state) {
  135.   switch (topic) {
  136.     case 'xpcom-shutdown':
  137.       var obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  138.       obs.removeObserver(this, 'xpcom-shutdown');
  139.       return;
  140.   }
  141. }
  142.  
  143. flockWPService.prototype.addAccount =
  144. function flockWPService_addAccount(aUsername, aPassword, aListener)
  145. {
  146.   //DEBUG("{flockIWebService}.addAccount('"+aUsername+"', 'XXXXXXXX', ...)");
  147.   //DEBUG(" THIS FUNCTION IS DEPRECATED AND SHOULD BE REPLACED WITH A CALL TO addAccountById() !");
  148.   return this.addAccountById(aUsername, true, aListener);
  149. }
  150.  
  151. flockWPService.prototype.addAccountById =
  152. function flockWPService_addAccountById(aUsername, aIsTransient, aListener)
  153. {
  154.   var accountURN = this.urn+":"+aUsername;
  155.   var account = new this.faves_coop.Account(accountURN, {
  156.     name: aUsername,
  157.     serviceId: this.contractId,
  158.     service: this.wpService,
  159.     accountId: aUsername,
  160.     isPollable : false,
  161.     isTransient: aIsTransient,
  162.     favicon: this.icon,
  163.     URL: this.url,
  164.     showInSidebar: false
  165.   });
  166.   this.faves_coop.accounts_root.children.addOnce(account);
  167.   // this.USER = blAccount.id();
  168.   // var acct = this.getAccount(blAccount.id());
  169.  
  170.   this.USER = accountURN;
  171.  
  172.   // Add the blog account
  173.   var wpsvc = this;
  174.   var listener = {
  175.     onResult: function(aResult) {
  176.       var theBlog;
  177.       while (aResult.hasMoreElements()) {
  178.         theBlog = aResult.getNext();
  179.         theBlog.QueryInterface(Ci.flockIBlogAccount);
  180.         theCoopBlog = new wpsvc.faves_coop.Blog(accountURN+":"+theBlog.blogid, {
  181.           name: theBlog.title,
  182.           title: theBlog.title,
  183.           blogid: theBlog.blogid,
  184.           URL: theBlog.URL,
  185.           apiLink: theBlog.URL+'xmlrpc.php'
  186.         });
  187.         account.children.addOnce(theCoopBlog);
  188.         dump("Added the wordpress blog "+theBlog.title+"\n");
  189.  
  190.         // Comments: create the "My Blogs" folder if needed
  191.         var feedManager = Components.classes["@flock.com/feed-manager;1"].getService(Components.interfaces.flockIFeedManager);
  192.         var blogFolder = null;
  193.         var _enum = feedManager.getFeedContext("news").getRoot().getChildren();
  194.         while (_enum.hasMoreElements() && !blogFolder) {
  195.           var candidate = _enum.getNext();
  196.           if (candidate.getTitle() == "My Blogs")
  197.             blogFolder = candidate;
  198.         }
  199.         if (!blogFolder)
  200.           blogFolder = feedManager.getFeedContext("news").getRoot().addFolder("My Blogs");
  201.         // Comments: add the stream
  202.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  203.         var uri = ios.newURI(theBlog.URL+"comments/feed/", null, null);
  204.         var feedManagerListener = {
  205.           onGetFeedComplete: function(feed) {
  206.             blogFolder.subscribeFeed(feed);
  207.           },
  208.           onError: function(error) {
  209.           }
  210.         }
  211.         feedManager.getFeed(uri, feedManagerListener);
  212.       }
  213.       if (aListener) aListener.onSuccess(acct, "addAccount");
  214.     },
  215.     onFault: function(aError) {
  216.       aError.errorCode = aError.BLOG_INVALID_AUTH;
  217.       wpsvc.faves_coop.accounts_root.children.remove(account);
  218.       account.destroy();
  219.       if(aListener) {
  220.         aListener.onError(null, 'FAULT', aError);
  221.       }
  222.     },
  223.     onError: function(aError) {
  224.       aError.errorCode = aError.BLOG_INVALID_AUTH;
  225.       wpsvc.faves_coop.accounts_root.children.remove(account);
  226.       account.destroy();
  227.       if(aListener) {
  228.         aListener.onError(null, 'ERROR', aError);
  229.       }
  230.     }
  231.   };
  232.  
  233.   this.getUsersBlogs(listener, null);
  234.  
  235.   var acct = this.getAccount(accountURN);
  236.   return acct;
  237. }
  238.  
  239.  
  240. flockWPService.prototype.init =
  241. function ()
  242. {
  243.   DEBUG(".init()");
  244.  
  245.   if (this.initialized) return;
  246.   this.initialized = true;
  247.  
  248.   var evtID = this._profiler.profileEventStart("wp-init");
  249.  
  250.   this.prefService = Components.classes["@mozilla.org/preferences-service;1"]
  251.                                .getService(Components.interfaces.nsIPrefBranch);
  252.   if ( this.prefService.getPrefType(SERVICE_ENABLED_PREF) &&
  253.        !this.prefService.getBoolPref(SERVICE_ENABLED_PREF) )
  254.   {
  255.     DEBUG("Pref "+SERVICE_ENABLED_PREF+" set to FALSE... not initializing.");
  256.     var catMgr = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
  257.     catMgr.deleteCategoryEntry("wsm-startup", CATEGORY_COMPONENT_NAME, true);
  258.     catMgr.deleteCategoryEntry("flockWebService", CATEGORY_ENTRY_NAME, true);
  259.     return;
  260.   }
  261.  
  262.   // Logger
  263.   this.logger = Cc['@flock.com/logger;1'].createInstance(Ci.flockILogger);
  264.   this.logger.init("wordpress");
  265.  
  266.   // Attributes of flockIBlogWebService
  267.   this.supportsCategories = 2;
  268.   this.supportsPostReplace = true;
  269.   this.metadataOverlay = "";
  270.  
  271.   this.acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
  272.  
  273.   this.faves_coop = Cc['@flock.com/singleton;1'].getService(Ci.flockISingleton).getSingleton('chrome://browser/content/flock/common/load-faves-coop.js').wrappedJSObject;
  274.     this.account_root = this.faves_coop.accounts_root;
  275.  
  276.     this.wpService = new this.faves_coop.Service('urn:wordpress:service');
  277.   this.wpService.name = 'wordpress';
  278.   this.wpService.desc = 'The Wordpress.com Service';
  279.   this.wpService.logoutOption = false;
  280.   this.wpService.domains = "wordpress.com";
  281.   this.wpService.serviceId = WORDPRESS_CONTRACTID;
  282.  
  283.   this.urn = this.wpService.id();
  284.   this.url = "http://www.wordpress.com";
  285.  
  286.   this.webDetective = this.acUtils.useWebDetective("wordpress.xml");
  287.  
  288.   this._profiler.profileEventEnd(evtID, "");
  289. }
  290.  
  291.  
  292. flockWPService.prototype.refresh =
  293. function flockWPService_refresh(aURN, aListener)
  294. {
  295.     debug ("flockWPService refresh with aURN of " + aURN + "\n");
  296.  
  297.     // Introspection against what we're syncing - Identity or Account or Item?
  298.     var refreshItem = this.faves_coop.get(aURN);
  299.  
  300.   if (refreshItem instanceof this.faves_coop.Account) {
  301.     }
  302.   else if (refreshItem instanceof this.faves_coop.Favorite) {
  303.     }
  304.   else {
  305.         throw Components.results.NS_ERROR_ABORT;
  306.     }
  307. }
  308.  
  309. flockWPService.prototype.refreshAccount =
  310. function flockWPService_refreshAccount (aURN, aListener) {
  311.   debug("WPService - refreshAccount with aURN of " + aURN);
  312. }
  313.  
  314.  
  315. // BEGIN flockIBlogWebService interface
  316.  
  317. flockWPService.prototype._youtubize = function WPS_youtubize (aContent) {
  318.   var result = aContent;
  319.  
  320.   var re = /<object.*><param.*value="(.+?)".*>.*<\/object>/;
  321.   var arr = re.exec(result);
  322.   while (arr) {
  323.     result = result.replace(arr[0], "[youtube="+arr[1].replace('/v/', '/w/?v=')+"]");
  324.     arr = re.exec(result);
  325.   }
  326.   return result;
  327. }
  328.  
  329. flockWPService.prototype.newPost =
  330. function(aListener, aBlogId, aPost, aPublish, aNotifications)
  331. {
  332.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  333.   aPost.description = this._youtubize(aPost.description);
  334.   mtService.newPost(aListener, aBlogId, aPost, aPublish, aNotifications);
  335. }
  336.  
  337. flockWPService.prototype.editPost =
  338. function(aListener, aBlogId, aPost, aPublish, aNotifications)
  339. {
  340.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  341.   mtService.editPost(aListener, aBlogId, aPost, aPublish, aNotifications);
  342. }
  343.  
  344. flockWPService.prototype.deletePost =
  345. function(aListener, aBlogId, aPostid)
  346. {
  347.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  348.   mtService.deletePost(aListener, aBlogId, aPostid);
  349. }
  350.  
  351. flockWPService.prototype.getUsersBlogs =
  352. function(aListener, aUrl)
  353. {
  354.   var username = this.faves_coop.get(this.USER).name;
  355.   var pw = this.acUtils.getPassword(this.urn+':'+username);
  356.  
  357.   var listener = new userBlogsListener(aListener, false);
  358.   var xmlrpcServer = new flockXmlRpcServer ('http://wordpress.com/xmlrpc.php');
  359.   var args = ["flockbrowser", username, pw.password];
  360.   xmlrpcServer.call("blogger.getUsersBlogs", args, listener);
  361. }
  362.  
  363. flockWPService.prototype.getRecentPosts =
  364. function(aListener, aBlogId, aNumber)
  365. {
  366.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  367.   mtService.getRecentPosts(aListener, aBlogId, aNumber);
  368. }
  369.  
  370. flockWPService.prototype.getCategoryList =
  371. function(aListener, aBlogId)
  372. {
  373.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  374.   mtService.getCategoryList(aListener, aBlogId);
  375. }
  376. // END flockIBlogWebService interface
  377.  
  378.  
  379. // BEGIN flockIManageableWebService interface
  380.  
  381. flockWPService.prototype.getCredentialsFromForm =
  382. function flockWPService_getCredentialsFromForm(aForm)
  383. {
  384.   this.logger.debug("{flockIManageableWebService}.getCredentialsFromForm(aForm)");
  385.   aForm.QueryInterface(Ci.nsIDOMHTMLFormElement);
  386.   this.lastPassword = this.acUtils.extractPasswordFromHTMLForm(aForm);
  387.  
  388.   return {
  389.     QueryInterface: function(aIID) {
  390.       if (!aIID.equals(Ci.nsISupports) &&
  391.         !aIID.equals(Ci.nsIPassword) &&
  392.         !aIID.equals(Ci.flockIPasswordOrigin)) { 
  393.         throw Ci.NS_ERROR_NO_INTERFACE;
  394.       }
  395.       return this;
  396.     },
  397.     host: "",
  398.     user: this.lastPassword.user,
  399.     password: this.lastPassword.password,
  400.     formType: "login"
  401.   };
  402. }
  403.  
  404.  
  405. flockWPService.prototype.getAccountIDFromDocument =
  406. function flockWPService_getAccountIDFromDocument(aDocument)
  407. {
  408.   this.logger.debug("{flockIManageableWebService}.getAccountIDFromDocument(aDocument)");
  409.   aDocument.QueryInterface(Components.interfaces.nsIDOMHTMLDocument);
  410.  
  411.   var results = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag2);
  412.   var results2 = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag2);
  413.   if (this.webDetective.detect("wordpress", "blogURL", aDocument, results)) {
  414.     this.blogURL = results.getPropertyAsAString("blogURL").replace("/wp-admin","");
  415.   }
  416.   else // The landing page IS the blog URL
  417.     this.blogURL = aDocument.URL;
  418.  
  419.   if (this.webDetective.detect("wordpress", "accountinfo", aDocument, results2))
  420.     return results2.getPropertyAsAString("accountid");
  421.   else if (this.lastPassword)
  422.     return this.lastPassword.user;
  423.   else
  424.     return null;
  425. }
  426.  
  427. flockWPService.prototype.updateAccountStatusFromDocument =
  428. function flockWPService_updateAccountStatusFromDocument(aDocument)
  429. {
  430.   this.logger.debug("{flockIManageableWebService}.updateAccountStatusFromDocument()");
  431.   if (this.ownsDocument(aDocument)) {
  432.     if (this.docRepresentsSuccessfulLogin(aDocument)) {
  433.       var accountID = this.getAccountIDFromDocument(aDocument);
  434.       var acctURN = this.acUtils.getAccountURNById(this.urn, accountID);
  435.       
  436.       var avatarURL;
  437.       var results = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag2);
  438.       if (this.webDetective.detect("wordpress", "accountinfo", aDocument, results)) {
  439.         try {
  440.           avatarURL = results.getPropertyAsAString("avatarURL");
  441.         } catch (ex) {
  442.           // No avatar was found on the page
  443.         }
  444.       }
  445.  
  446.       var acctURN = this.acUtils.getAccountURNById(this.urn, accountID);
  447.       var acct = this.faves_coop.get(acctURN);
  448.       if (acct) {
  449.         acct.avatar = avatarURL;
  450.  
  451.         var accounts = this.faves_coop.Account.find({
  452.           serviceId: WORDPRESS_CONTRACTID
  453.         });
  454.         for (var i = 0; i < accounts.length; i++) {
  455.           if (accounts[i].id() == acctURN) {
  456.             accounts[i].isAuthenticated = true;
  457.           } else {
  458.             accounts[i].isAuthenticated = false;
  459.           }
  460.         }
  461.       }
  462.     } else {
  463.       var login = aDocument.getElementById("Login");
  464.       if (login) {
  465.         this.acUtils.markAllAccountsAsLoggedOut(WORDPRESS_CONTRACTID);
  466.       }
  467.     }
  468.   }
  469. }
  470.  
  471. flockWPService.prototype.logout =
  472. function flockWPService_logout(aDocument)
  473. {
  474.   this.logger.debug("{flockIManageableWebService}.logout()");
  475.   var cookieManager = Cc["@mozilla.org/cookiemanager;1"]
  476.                       .getService(Ci.nsICookieManager);
  477.   cookieManager.remove(".wordpress.com", "wordpressloggedin", "/", false);
  478.   cookieManager.remove(".wordpress.com", "__qca", "/", false);
  479.   cookieManager.remove(".wordpress.com", "__qcb", "/", false);
  480.   cookieManager.remove(".wordpress.com", "__utma", "/", false);
  481.   cookieManager.remove(".wordpress.com", "__utmb", "/", false);
  482.   cookieManager.remove(".wordpress.com", "__utmc", "/", false);
  483.   cookieManager.remove(".wordpress.com", "__utmz", "/", false);
  484. }
  485.  
  486. // END flockIManageableWebService interface
  487.  
  488.  
  489.  
  490. // ================================================
  491. // ========== BEGIN XPCOM Module support ==========
  492. // ================================================
  493.  
  494. function createModule(aParams) {
  495.   var Cc = Components.classes;
  496.   var Ci = Components.interfaces;
  497.   var Cr = Components.results;
  498.   return {
  499.     registerSelf: function (aCompMgr, aFileSpec, aLocation, aType) {
  500.       aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
  501.       aCompMgr.registerFactoryLocation( aParams.CID, aParams.componentName,
  502.                                         aParams.contractID, aFileSpec,
  503.                                         aLocation, aType );
  504.       var catMgr = Cc["@mozilla.org/categorymanager;1"]
  505.         .getService(Ci.nsICategoryManager);
  506.       if (!aParams.categories) { aParams.categories = []; }
  507.       for (var i = 0; i < aParams.categories.length; i++) {
  508.         var cat = aParams.categories[i];
  509.         catMgr.addCategoryEntry( cat.category, cat.entry,
  510.                                  cat.value, true, true );
  511.       }
  512.     },
  513.     getClassObject: function (aCompMgr, aCID, aIID) {
  514.       if (!aCID.equals(aParams.CID)) { throw Cr.NS_ERROR_NO_INTERFACE; }
  515.       if (!aIID.equals(Ci.nsIFactory)) { throw Cr.NS_ERROR_NOT_IMPLEMENTED; }
  516.       return { // Factory
  517.         createInstance: function (aOuter, aIID) {
  518.           if (aOuter != null) { throw Cr.NS_ERROR_NO_AGGREGATION; }
  519.           var comp = new aParams.componentClass();
  520.           if (aParams.implementationFunc) { aParams.implementationFunc(comp); }
  521.           return comp.QueryInterface(aIID);
  522.         }
  523.       };
  524.     },
  525.     canUnload: function (aCompMgr) { return true; }
  526.   };
  527. }
  528.  
  529. // NS Module entrypoint
  530. function NSGetModule(aCompMgr, aFileSpec) {
  531.   return createModule({
  532.     componentClass: flockWPService,
  533.     CID: WORDPRESS_CID,
  534.     contractID: WORDPRESS_CONTRACTID,
  535.     componentName: CATEGORY_COMPONENT_NAME,
  536.     implementationFunc: function (aComp) { getCompTK().addAllInterfaces(aComp); },
  537.     categories: [
  538.       { category: "wsm-startup", entry: CATEGORY_COMPONENT_NAME, value: WORDPRESS_CONTRACTID },
  539.       { category: "flockWebService", entry: CATEGORY_ENTRY_NAME, value: WORDPRESS_CONTRACTID }
  540.     ]
  541.   });
  542. }
  543.  
  544. // ========== END XPCOM Module support ==========
  545.  
  546.  
  547. /* ********** Account Class ********** */
  548.  
  549. function flockWPAccount() {
  550.   this.logger = Cc['@flock.com/logger;1'].createInstance(Ci.flockILogger);
  551.   this.logger.init("wordpressAccount");
  552.  
  553.   this.faves_coop = Cc['@flock.com/singleton;1'].getService(Ci.flockISingleton).getSingleton('chrome://browser/content/flock/common/load-faves-coop.js').wrappedJSObject;
  554.  
  555.   this.acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
  556.  
  557.   this.service = Cc[WORDPRESS_CONTRACTID].getService(Ci.flockIBlogWebService)
  558. }
  559.  
  560. // nsISupports implementation
  561. flockWPAccount.prototype.QueryInterface = function(iid) {
  562.   if (!iid.equals(Ci.nsISupports) &&
  563.     !iid.equals(Ci.flockIWebServiceAccount) &&
  564.     !iid.equals(Ci.flockIBlogWebServiceAccount))
  565.   {
  566.     throw Components.results.NS_ERROR_NO_INTERFACE;
  567.   }
  568.   return this;
  569. }
  570.  
  571. // flockIWebServiceAccount implementation
  572. flockWPAccount.prototype.login = function(listener) {
  573.   this.logger.info("{flockIWebServiceAccount}.login()");
  574.   if (listener) {
  575.     listener.onSuccess(this, "login");
  576.   }
  577. }
  578. flockWPAccount.prototype.logout = function(listener) {
  579.   this.logger.info("{flockIWebServiceAccount}.logout()");
  580.   var c_acct = this.faves_coop.get(this.urn);
  581.   if (c_acct.isAuthenticated) {
  582.     c_acct.isAuthenticated = false;
  583.     var cookieManager = Components.classes["@mozilla.org/cookiemanager;1"]
  584.                                   .getService(Components.interfaces.nsICookieManager);
  585.     cookieManager.remove(".wordpress.com", "wordpressloggedin", "/", false);
  586.     cookieManager.remove(".wordpress.com", "__qca", "/", false);
  587.     cookieManager.remove(".wordpress.com", "__qcb", "/", false);
  588.     cookieManager.remove(".wordpress.com", "__utma", "/", false);
  589.     cookieManager.remove(".wordpress.com", "__utmb", "/", false);
  590.     cookieManager.remove(".wordpress.com", "__utmc", "/", false);
  591.     cookieManager.remove(".wordpress.com", "__utmz", "/", false);
  592.   }
  593.   if (listener) {
  594.     listener.onSuccess(this, "logout");
  595.   }
  596. }
  597. flockWPAccount.prototype.activate = function(aListener) {
  598.   this.logger.info("{flockIWebServiceAccount}.activate()");
  599. }
  600. flockWPAccount.prototype.deactivate = function(aListener) {
  601.   this.logger.info("{flockIWebServiceAccount}.deactivate()");
  602. }
  603. flockWPAccount.prototype.keep = function() {
  604.   var c_acct = this.faves_coop.get(this.urn);
  605.   c_acct.isTransient = false;
  606.   this.acUtils.makeTempPasswordPermanent(this.service.urn+':'+c_acct.accountId);
  607. }
  608. flockWPAccount.prototype.remove = function() {
  609.   this.service.removeAccount(this.urn);
  610. }
  611.  
  612. // flockIBlogWebServiceAccount implementation
  613. flockWPAccount.prototype.getBlogs = function() {
  614.   this.logger.info("{flockIBlogWebServiceAccount}.getBlogs()");
  615.   var blogsEnum = {
  616.     QueryInterface : function(iid) {
  617.       if (!iid.equals(Ci.nsISupports) &&
  618.           !iid.equals(Ci.nsISimpleEnumerator))
  619.       {
  620.         throw Components.results.NS_ERROR_NO_INTERFACE;
  621.       }
  622.       return this;
  623.     },
  624.     hasMoreElements : function() {
  625.       return false;
  626.     },
  627.     getNext : function() {
  628.     }
  629.   };
  630.   return blogsEnum;
  631. }
  632.  
  633.